Amazon CloudWatchメトリクスを取得するとき、AWS/LambdaとLambda Insightsでは関数指定のディメンション名が違う

Amazon CloudWatchメトリクスを取得するとき、AWS/LambdaとLambda Insightsでは関数指定のディメンション名が違う

Amazon CloudWatchメトリクスを取得する際、AWS/LambdaとLambda Insightsでは関数指定のディメンション名が違います。けっこう微妙な違いであり、他にも間違う人がいるのでは?と思ったので、今回まとめてみます。
Clock Icon2024.12.10

Amazon CloudWatchアラームでAWS Lambdaのメトリクスが取れていない?

おのやんです。

みなさん、Amazon CloudWatch(以下、CloudWatch)アラームでAWS Lambda(以下、Lambda)のメトリクスが取れていない状況に遭遇したことはありませんか?私はあります。

まず、「Lambdaをメトリクスを取りたい」というケースを考えた場合、取得できるメトリクスが主に2種類あります。

ひとつがLambda標準のメトリクスです。AWS/Lambdaの名前空間で取得することができ、Lambda関数の使用率・パフォーマンス、エラー率などを取得することができます。

https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/monitoring-metrics.html

もうひとつはLambda Insightsのメトリクスです。Lambda関数に対して追加の設定を加えることで、CPU関係の値やデータ通知量など、より細かい数値が確認可能です。こちらはLambdaInsightsの名前空間で取得可能です。

https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/monitoring/Lambda-Insights-metrics.html

Lambda Insightsについての細かい設定方法は、こちらのブログにまとまとまっておりますので、よければご確認ください。

https://dev.classmethod.jp/articles/lambda-insights-structure-usage/

これら2種類のメトリクスですが、CloudWatchアラームを設定する場合に、Lambdaをこれらのメトリクスが表示されないケースがあります。結果から言うとアラームで指定するディメンションが間違っていたのが原因なのですが、ここが結構ややこしく、間違う人は他にもいるのでは?と感じました。

ということで、今回はそんな間違いポイントを紹介します。

実際のケース

例えば以下のノリでAWS/Lambdaのメトリクスと同じようにLambdaInsightsのCloudWatchアラームを設定している場合、メモリ使用量のCloudWatchアラームではLambdaInsightsのused_memory_maxメトリクスが取れていない状態になります。

  # Lambda関数用 実行時間CloudWatch Alarm
  AWSTestFunctionTimeAlarm:
    Type: AWS::CloudWatch::Alarm
    Properties:
      AlarmActions:
        - !Ref AWSTestSNSTopic
      AlarmName: !Sub ${SystemName}-${EnvName}-function-time-alarm
      Namespace: "AWS/Lambda"
      MetricName: "Duration"
      Statistic: "Average"
      Period: 300
      EvaluationPeriods: 1
      ComparisonOperator: "GreaterThanOrEqualToThreshold"
      Threshold: 600000
      Dimensions:
        - Name: "FunctionName"
          Value: !Ref AWSTestFunction

  # Lambda関数用 メモリ使用量CloudWatch Alarm
  AWSTestFunctionMemoryUsageAlarm:
    Type: AWS::CloudWatch::Alarm
    Properties:
      AlarmActions:
        - !Ref AWSTestSNSTopic
      AlarmName: !Sub ${SystemName}-${EnvName}-memory-usage-alarm
      Namespace: "LambdaInsights"
      MetricName: "used_memory_max"
      Statistic: "Average"
      Period: 300
      EvaluationPeriods: 1
      ComparisonOperator: "GreaterThanOrEqualToThreshold"
      Threshold: 7168
      Dimensions:
        - Name: "FunctionName"
          Value: !Ref AWSTestFunction

AWS/LambdaとLambda Insightsで、関数指定のディメンション名が違う

上記のコードを見て気付いた方もいるかと思いますが、AWS/Lambda名前空間とLambdaInsights名前空間では、Lambda関数を指定する時のディメンション名が違います。具体的には、AWS/Lambda名前空間ではFunctionName、LambdaInsights名前空間ではfunction_nameです。アッパーキャメルケースとスネークケースという違いですが、ここが違うと「データ不足」となりアラーム上でデータを取れなかったりするので、注意してください。

  # Lambda関数用 実行時間CloudWatch Alarm
  AWSTestFunctionTimeAlarm:
    Type: AWS::CloudWatch::Alarm
    Properties:
      AlarmActions:
        - !Ref AWSTestSNSTopic
      AlarmName: !Sub ${SystemName}-${EnvName}-function-time-alarm
      Namespace: "AWS/Lambda"
      MetricName: "Duration"
      Statistic: "Average"
      Period: 300
      EvaluationPeriods: 1
      ComparisonOperator: "GreaterThanOrEqualToThreshold"
      Threshold: 600000
      Dimensions:
        - Name: "FunctionName"
          Value: !Ref AWSTestFunction

  # Lambda関数用 メモリ使用量CloudWatch Alarm
   AWSTestFunctionMemoryUsageAlarm:
     Type: AWS::CloudWatch::Alarm
     Properties:
       AlarmActions:
         - !Ref AWSTestSNSTopic
       AlarmName: !Sub ${SystemName}-${EnvName}-memory-usage-alarm
       Namespace: "LambdaInsights"
       MetricName: "used_memory_max"
       Statistic: "Average"
       Period: 300
       EvaluationPeriods: 1
       ComparisonOperator: "GreaterThanOrEqualToThreshold"
       Threshold: 7168
       Dimensions:
-        - Name: "FunctionName"
+        - Name: "function_name"
           Value: !Ref AWSTestFunction

CloudWatchメトリクスは公式ドキュメントを読もう

ドキュメントを見ずにノリで実装すると結構間違うので、ちゃんと公式ドキュメントで確認してから実装するようにしてください。では!

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.